package com.ruoyi.spspublic.service.impl;

import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.spspublic.domain.TMisMessage;
import com.ruoyi.spspublic.domain.vo.TagListVO;
import com.ruoyi.spspublic.mapper.TMisMessageMapper;
import com.ruoyi.spspublic.mapper.TMisTaskMapper;
import com.ruoyi.spspublic.service.ITMisMessageService;
import com.ruoyi.spspublic.service.ITMisReadRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * 我的待阅Service业务层处理
 *
 * @author wangwei
 * @date 2023-06-09
 */
@Service
public class TMisMessageServiceImpl implements ITMisMessageService {
  @Autowired private TMisMessageMapper tMisMessageMapper;

  @Resource private ITMisReadRecordService readRecordService;

  @Resource private TMisTaskMapper taskMapper;

  /**
   * 查询我的待阅
   *
   * @param ctId 我的待阅ID
   * @return 我的待阅
   */
  @Override
  public TMisMessage selectTMisMessageById(String ctId) {
    return tMisMessageMapper.selectTMisMessageById(ctId);
  }

  /**
   * 查询我的待阅列表
   *
   * @param tMisMessage 我的待阅
   * @return 我的待阅
   */
  @Override
  public List<TMisMessage> selectTMisMessageList(TMisMessage tMisMessage) {
    tMisMessage.setCtFinish("0");
    tMisMessage.setCtInceptP(SecurityUtils.getUsername());
    tMisMessage.setCtType(tMisMessage.getCtType());
    return tMisMessageMapper.selectTMisMessageList(tMisMessage);
  }

  /**
   * 新增我的待阅
   *
   * @param tMisMessage 我的待阅
   * @return 结果
   */
  @Override
  public int insertTMisMessage(TMisMessage tMisMessage) {
    if (null == tMisMessage.getCtId() || "".equals(tMisMessage.getCtId())) {
      tMisMessage.setCtId(IdUtils.simpleUUID());
    }
    return tMisMessageMapper.insertTMisMessage(tMisMessage);
  }

  /**
   * 修改我的待阅
   *
   * @param tMisMessage 我的待阅
   * @return 结果
   */
  @Override
  public int updateTMisMessage(TMisMessage tMisMessage) {
    return tMisMessageMapper.updateTMisMessage(tMisMessage);
  }

  /**
   * 批量删除我的待阅
   *
   * @param ctIds 需要删除的我的待阅ID
   * @return 结果
   */
  @Override
  public int deleteTMisMessageByIds(String[] ctIds) {
    return tMisMessageMapper.deleteTMisMessageByIds(ctIds);
  }

  /**
   * 删除我的待阅信息
   *
   * @param ctId 我的待阅ID
   * @return 结果
   */
  @Override
  public int deleteTMisMessageById(String ctId) {
    return tMisMessageMapper.deleteTMisMessageById(ctId);
  }

  /**
   * 设置待阅为完成
   *
   * @param tMisMessage 请求体
   * @return 返回结果
   */
  @Override
  public int setFinish(TMisMessage tMisMessage) {
    AtomicInteger result = new AtomicInteger();
    tMisMessage.setCtInceptP(SecurityUtils.getUsername());
    List<TMisMessage> tMisMessages = tMisMessageMapper.selectTMisMessageList(tMisMessage);
    if (StringUtils.isNotNull(tMisMessages) && tMisMessages.size() > 0) {
      tMisMessages.forEach(
          q -> {
            q.setCtFinish(Constants.ONE);
            q.setDtDateEnd(DateUtils.getNowDate());
            result.addAndGet(tMisMessageMapper.updateTMisMessage(q));
          });
    }
    // 统计一下每条单据都有谁看过了
    readRecordService.addRecord(tMisMessage);

    // 给业务单据浏览量+1
    //TMisFunction tMisFunction = PartyCacheUtils.getPartyFunInfoCache(tMisMessage.getCtFunNo());
    /*if (tMisFunction != null) {
      String tableName = tMisFunction.getCtTable();
      if (!"".equals(tableName) && null != tableName) {
        String sql =
            "UPDATE "
                + tableName
                + " SET am_click_volume = case when am_click_volume IS NULL then 1 ELSE am_click_volume + 1 end WHERE ct_id = '"
                + tMisMessage.getCtBussId()
                + "';";
        try {
          taskMapper.execute(sql);
        } catch (Exception ignored) {
        }
      }
    }*/



    // 单条数据新增导出合法性
    //        ValidationCodeUtils.setTicketExportValidation(tMisMessage.getCtFunNo(),
    // tMisMessage.getCtBussId(), SecurityUtils.getUsername());
    return 1;
  }

  @Override
  public void deleteUnreadWithdrawMessage(TMisMessage query) {
    tMisMessageMapper.deleteUnreadWithdrawMessage(
        query.getCtFunNo(), query.getCtBussId(), query.getCtFinish());
  }

  @Override
  public List<TagListVO> tagList() {
    SysUser currentUser = SecurityUtils.getLoginUser().getUser();
    TMisMessage query = new TMisMessage();
    query.setCtFinish("0");
    query.setCtInceptP(currentUser.getUserName());
    List<TMisMessage> misMessageList = tMisMessageMapper.selectTMisMessageList(query);
    Map<String, List<TMisMessage>> messageMap =
        misMessageList.stream().collect(Collectors.groupingBy(TMisMessage::getCtType));
    List<TagListVO> result = new ArrayList<>();
    for (Map.Entry<String, List<TMisMessage>> entry : messageMap.entrySet()) {
      TagListVO tagListVO = new TagListVO();
      //
      // tagListVO.setTag(ApplicationContextUtils.getBean(ISysDictDataService.class).selectDictLabel("message_task", entry.getKey()));
      tagListVO.setTag(entry.getKey());
      tagListVO.setAmount(entry.getValue().size());
      result.add(tagListVO);
    }
    return result;
  }
}
